package com.jdz.vo;

import java.io.File;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class FileDownloadController {
	
	@RequestMapping("/download")
	public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
			String filename) throws Exception{
		//指定要下载的文件所在路劲
		String path = request.getSession().getServletContext().getRealPath("/upload/");

		//创建该文件对象
		File file = new File(path.trim()+File.separator+filename.trim());


		//如果保存文件的地址不存在，就先创建目录
		if(!file.exists()){
			file.mkdirs();
		}

		//对文件名编码，防止中文文件乱码		
	    filename = this.getFilename(request,filename);
		//设置响应头
		HttpHeaders headers = new HttpHeaders();
		//通知浏览器以下载的方式打开文件
		headers.setContentDispositionFormData("attachment", filename);
		//定义以流的形式下载返回文件数据
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
		//使用Spring MVC框架的ResponseEntity对象封装返回下载数据
		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
				headers,HttpStatus.OK);
	}
	
	/**
	 * 根据浏览器的不同进行编码设置返回编码后的文件名
	 */
	public  String getFilename(HttpServletRequest request,String filename) throws Exception{
		//IE不通版本User-Agent中出现的关键词
		String[] IEBrowserKeyWords = {"MSIE","Trident","Edge"};
		//获取请求头代理信息
		String userAgent = request.getHeader("User-Agent");
		for(String keyWord : IEBrowserKeyWords){
			if(userAgent.contains(keyWord)){
				//IE内核浏览器，统一为UTF-8编码显示
				return URLEncoder.encode(filename,"UTF-8");
			}
		}
		//火狐等其他浏览器统一为ISO-8859-1编码显示
		return new String(filename.getBytes("UTF-8"),"ISO-8859-1");
	}
	
}
